package com.atguigu.stack.polish.calculator.infix;

/**
 * @ClassName ArrayStack
 * @DeScription 使用数组实现的堆栈
 * @Author 剧情再美终是戏
 * @Date 2019/11/29 20:44
 * @Version 1.0
 **/
public class ArrayStack {

    // 最大的长度
    private int maxSize;

    // 指定，指向下标
    private int pointer;

    // 存放数据的集合
    private int[] arr;

    public ArrayStack(int maxSize) {
        this.maxSize = maxSize;

        // 初始化指针
        pointer = -1;

        // 初始化数组
        arr = new int[maxSize];
    }

    // 判断是否为空
    public boolean isEmpty() {
        return -1 == pointer;
    }

    // 判断是否满了
    public boolean isFull() {
        return pointer == maxSize - 1;
    }


    // 入栈
    public void push(int val) {

        // 判断是否满了
        if (isFull()) {
            System.out.println("栈满了，入栈失败");
            return;
        }

        pointer++; // 指针加1
        arr[pointer] = val;
    }

    // 出栈
    public int pull() {

        // 判断是否为空
        if (isEmpty()) {
            String msg = "栈空了，出栈失败";
            System.out.println(msg);
            throw new RuntimeException(msg);
        }

        // 获取值
        int result = arr[pointer];
        pointer--; // 指针减1
        return result;
    }

    // 打印栈中的数据
    public void show() {

        // 判断栈中是否空了
        if (isEmpty()) {
            System.out.println("栈空了，出栈失败");
            return;
        }

        // 打印
        for (int i = pointer; i >= 0; i--) {
            System.out.printf("arr[%d]=%d\n", i, arr[i]);
        }
    }

    // 查看栈顶的值(不是取出来，只是看一下)
    public int look() {
        // 判断是否为空
        if (isEmpty()) {
            String msg = "栈空了，出栈失败";
            System.out.println(msg);
            throw new RuntimeException(msg);
        }

        // 获取值
        return arr[pointer];
    }

    // 判断运算符的优先级别
    public int dudgePriority(int operrator) {
        if ("+".equals(operrator) || "-".equals(operrator)) {
            return 0;
        } else if ("*".equals(operrator) || "/".equals(operrator)) {
            return 1;
        } else {
            throw new RuntimeException("运算符号有误");
        }
    }
}
